jQuery(document).ready(function(){
    // скрываю капчу после загрузки окна
    jQuery('form.jform img.captchaImage').hide();
    // активирую кнопку "зачем?"
    jQuery('form.jform a.whatFor').click(function(){
        jQuery(this).hide();
        jQuery('form.jform span.whatFor').fadeIn('slow');
        setTimeout(function() {
            jQuery('form.jform span.whatFor').fadeOut(1000);
        }, 30000);
        return false;
    });
    // прошу снимать фокус при нажатии на аякс ссылки
    jQuery('form.jform a.ajaxLink').click(function(){
        jQuery(this).blur();
        return false;
    });
    // показываю картинку с капчей после загрузки окна
    setTimeout(function() {
        jQuery('form.jform img.captchaImage').fadeIn('fast');
    }, 4000);
    // активизирую кнопку "показать другую капчу"
    jQuery('form.jform a.showAnother').click(function(){
        jQuery('form.jform img.captchaImage').each(function(){
            jQuery(this).fadeOut('fast');
            jQuery(this).attr('src', jQuery(this).attr('htmlSrc')+'?'+Math.random()*100);
        })
        setTimeout(function() {
            jQuery('form.jform img.captchaImage').fadeIn('slow');
        }, 3000);
        //    jQuery('form.jform a.showAnother').blur();
        return false;
    })
    // скрываю индикатор проверки формы через ajax
    jQuery('form.jform img.ajaxLoading').hide();
    // инициализирую всю валидацию
    jQuery('form.validate').validate({
        errorPlacement: function(error, element) {
            /*curE = element;
            while(jQuery(curE).attr('mark') != 'controlWrapper'){
                curE = jQuery(curE).parent();
            }*/
            curE = jQuery(element).parents('div.element');
            error.appendTo(curE);
            jQuery('label',curE).height(jQuery('label',curE).height() + error.height());
        //error.height()
        //error.css('margin-left', jQuery('label',curE).width());
        //      offset = element.offset();
        //      error.css('top', offset.top - error.height() - 50);
        },
        wrapper: "ul class='errorMessagesWrapper'",
        highlight: function(element, errorClass, validClass) {
            jQuery(element).addClass(errorClass);
            jQuery(element).removeClass(validClass);
            curE = jQuery(element).parents('div[mark=controlWrapper]');
            /*curE = element;
            while(jQuery(curE).attr('mark') != 'controlWrapper'){
                curE = jQuery(curE).parent();
            }*/
            jQuery(curE).addClass(errorClass);
            jQuery(curE).removeClass(validClass);
            jQuery('ul.errorMessagesWrapper', curE).show();
        },
        unhighlight: function(element, errorClass, validClass) {
            jQuery(element).removeClass(errorClass);
            jQuery(element).addClass(validClass);
            curE = jQuery(element).parents('div[mark=controlWrapper]');
            jQuery(curE).removeClass(errorClass);
            jQuery(curE).addClass(validClass);
            jQuery('ul.errorMessagesWrapper', curE).hide();
        },
        errorElement: "li",
        // handle actual submit
        submitHandler: function(form) {
            //      return true;
            setTimeout(resizeItAll,50);
            remote = jQuery(form).attr('remote');
            var f = form;
            if(undefined != remote){
                url = remote;
                if( remote.indexOf('?') == -1)
                    url += '?';
                url += '&phpClassName=' + jQuery(form).attr('phpClassName');
                url += '&databaseId=' + jQuery(form).attr('databaseId');
                //validate using ajax!
                jQuery.ajax({
                    cache: false,
                    url: url,
                    data: jQuery(form).serialize(),
                    dataType: 'json',
                    beforeSend: function(XMLHttpRequest){
                        jQuery('img.ajaxLoading', f).show();
                        jQuery('input[type|=submit]',f).each(function(){
                            jQuery(this).attr('disabled','disabled');
                        })
                    },
                    success: function(data, textStatus, XMLHttpRequest){
                        if(data == true){
                            f.submit();
                        } else {
                            jQuery('input[type|=submit]',f).each(function(){
                                jQuery(this).removeAttr('disabled');
                            });
                            alert(data);
                        }
                    },
                    error: function(data, textStatus, XMLHttpRequest){
                        jQuery('input[type|=submit]',f).each(function(){
                            jQuery(this).removeAttr('disabled');
                        });
                    },
                    complete: function(XMLHttpRequest, textStatus){
                        jQuery('img.ajaxLoading',jQuery(f)).fadeOut('slow');
                    },
                    type: 'post'
                });
            } else {
                jQuery('input[type=submit]',form).attr('disabled','disabled').addClass('disabled').blur();
                f.submit();
            }
            return true;
        }

    });
    // элемент со количеством файлов больше одного
    jQuery('form.jform .multifile').each(function(){
        jQuery('.files',this).each(function(){
            jQuery('li.no-value:first',this).hide().addClass('prototype').each(function(){
                jQuery('input',this).attr('disabled', 'disabled');
            });
            // обрабатываем поле ввода значений
            jQuery('input[type=file]', this).each(function(){
                //jQuery(this).attr('name', jQuery(this).attr('name')+'[]');
            });
            // обрабатываем элементы в которых уже загруженные значения
            jQuery('.with-value', this).each(function(){
                jQuery('.removeUpload', this).click(function(){
                    //myParent = jQuery(this).parents('.with-value');
                    jQuery('input[type=hidden]', jQuery(this).parents('.with-value')).attr('value',jQuery(this).attr('rel'));
                    jQuery(this).parents('.with-value').addClass('cancelled').fadeOut('slow');
                    filter = jQuery('.files .file',jQuery(this).parents('.multifile:first')).filter(function(index){
                        return false == (jQuery(this).hasClass('cancelled') || jQuery(this).hasClass('prototype'));
                    });
                    if(1 > filter.length){
                        jQuery('li.more .moreLink', jQuery(this).parents('.multifile:first')).click();
                    }
                    if(0 == filter.length){
                        filter = jQuery('.files .file',jQuery(this).parents('.multifile:first')).filter(function(index){
                            return false == (jQuery(this).hasClass('cancelled') || jQuery(this).hasClass('prototype'));
                        });
                        jQuery('.removeField',filter).hide();
                    }
                    resizeForm();
                    resizeItAll();
                    return false;
                });
                jQuery('.removeUpload', this).show();
            });
            // прячем ссылку "убрать поле" у второго элемента в списке
            jQuery('.removeField',jQuery('li.no-value:eq(1)', this)).hide();
            // обрабатываем элемент .file списка
            jQuery('.file', this).each(function(){
                jQuery('.removeField', this).click(function(){
                    jQuery(this).parents('.file').addClass('cancelled');
                    filter = jQuery('.file', jQuery(this).parents('.files')).filter(function(index){
                        return false == (jQuery(this).hasClass('cancelled') || jQuery(this).hasClass('prototype'));
                    });

                    if(2 > filter.length)
                        jQuery('.removeField:first',filter).hide();
                    jQuery(this).parent().remove();
                    resizeForm();
                    resizeItAll();
                });
            });
            // ссылка "загрузить еще"
            jQuery('li.more .moreLink', this).click(function(){
                cand = jQuery('li.no-value:first',jQuery(this).parents('.files')).clone(true).removeClass('prototype');
                jQuery('input',cand).removeAttr('disabled');
                if(2 > jQuery('.file',jQuery(this).parents('.files')).filter(function(index){
                    return false == jQuery(this).hasClass('cancelled');
                }).length)
                    jQuery('.removeField',cand).hide();
                else
                    jQuery('.no-value .removeField',jQuery(this).parents('.files')).show();
                cand.insertBefore(jQuery(this).parent()).show();
                resizeForm();
                resizeItAll();
            });
        });
    });
    // инициализирую поле с единственным файлом
    jQuery('form.validate span.file').each(function(){
        var file = this;
        if( jQuery('a.newUpload', file).size()){
            jQuery('span.filename', this).show();
            jQuery('input[type|=file]', this).hide().attr('disabled', 'disabled');
            jQuery('a.newUpload', this).show();
            jQuery('a.cancelUpload', this).hide();
            jQuery('a.cancelUpload', this).click(function(){
                jQuery(this).parents('div[mark|=controlWrapper]').removeClass('error');
                jQuery('a.newUpload', file).show();
                jQuery('a.cancelUpload', file).hide();
                jQuery('span.filename', file).show();
                jQuery('input[type|=file]', file).hide().attr('disabled', 'disabled');
                return false;
            });
            jQuery('a.newUpload', this).click(function(){
                jQuery('a.newUpload', file).hide();
                jQuery('a.cancelUpload', file).show();
                jQuery('span.filename', file).hide();
                jQuery('input[type|=file]', file).show().removeAttr('disabled');
                return false;
            });
        }
    });
    // навешиваю события на управляющие элементы поля типа "файл"
    jQuery('form.jform .file').each(function(){
        if(jQuery('input',this).attr('value'))
            jQuery('.file_clear', jQuery(this).parents('.file')).show();
        jQuery('input', this).change(function(){
            if(jQuery(this).attr('value') != '')
                jQuery('.file_clear', jQuery(this).parents('.file')).fadeIn();
        });
        jQuery('.file_clear', this).click(function(){
            jQuery('input', jQuery(this).parents('.file')).attr('value', '');
            jQuery(this).fadeOut();
            //alert(jQuery('input', jQuery(this).parents('div.file')).attr('value'));
            return false;
        });
    });
    resizeForm();
    // прошу подогонать элементы окна после инициализации формы
    jQuery('form.jform').submit(function(){
        setTimeout(resizeItAll,50);
    });
});

/**
 * подгоняю размеры оберток для элементов формы под поля ввода (чтобы все было формально красиво)
 */
function resizeForm(){
    jQuery('form.jform .elementWrapper').each(function(){
        if(0 < jQuery('.element', this).length)
            jQuery(this).height(jQuery('.element', this).outerHeight(true));
    });
}

function resizeLabelFor(element){
    jQuery('label',element).height(jQuery('label',element).height() + error.height());
}